#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include "mem.h"

#define TAILLE_PILE 1000

pthread_mutex_t pile_lck;

int nb_malloc = 0, nb_alloc = 0;
int tete_pile[3] = {0,0,0};

void* pile[3][TAILLE_PILE];

void init_mem_threading()
{
	pthread_mutex_init(&pile_lck, NULL);
}

int nombre_alloc (void)
{
	return nb_alloc;
}

int nombre_malloc (void)
{
	return nb_malloc;
}

void* allouer (int taille, t_pile num_pile)
{
	void* ptr;

	pthread_mutex_lock(&pile_lck);
	if (tete_pile[num_pile] > 0)
	{
		tete_pile[num_pile]--;
		nb_alloc++;
		ptr = pile[num_pile][tete_pile[num_pile]];
	} else {
		nb_malloc++;
		ptr = malloc(taille);
	}
	pthread_mutex_unlock(&pile_lck);

	return ptr;
}

void restituer (void* ptr, t_pile num_pile)
{
	
	pthread_mutex_lock(&pile_lck);
	if (tete_pile[num_pile] >= TAILLE_PILE)
	{
		printf("DEBORDEMENT PILE %d\n", tete_pile[num_pile]);
		free(ptr);
		//exit(-1);
	} else {
		pile[num_pile][tete_pile[num_pile]] = ptr;
		ptr = 0;
		tete_pile[num_pile]++;
		
	}
	pthread_mutex_unlock(&pile_lck);
}

void restituer_tout (void* ptr_elements, void* ptr_clauses, void* ptr_variables)
{
	restituer(ptr_elements, ELEMENTS);
	restituer(ptr_clauses, CLAUSES);
	restituer(ptr_variables, VARIABLES);
}
